package main


//引入包的语法：import "包的路径"
//包名是从$GOPATH/src/后开始计算的，使用/进行路径分隔。需要配置环境变量
import (
	"fmt"
	"strconv"
)

var conn int=invokeFunc()

func main()  {
	println(conn)
}

func init(){
	println("util 函数被执行")
}

// 调用其它包的函数
func invokeFunc() int {
	return 10
}

//对函数返回值命名，里面顺序就无所谓了，顺序不用对应
func cal(a *int,b *int)(sum int,minus int){
	sum=*a+*b
	minus=*a-*b
	return
}
// 函数的引用传递 *表示传递引用,*a表示修改a变量引用的值
// 如果正常传递,则会拷贝一份数据传递给函数
func add(a *int){
	*a=100
}

// 函数的使用,可以有多个返回值
func cal2(a int,b int)(int,int){
	sum:=a+b
	minus:=a-b
	return sum,minus
}
// goto的使用
func gotoTest(){
	fmt.Println("hello golang1")
	fmt.Println("hello golang2")
	if 1 == 1 {
		goto label1 //goto一般配合条件结构一起使用
	}
	fmt.Println("hello golang3")
	fmt.Println("hello golang4")
	fmt.Println("hello golang5")
	fmt.Println("hello golang6")
    label1:
	fmt.Println("hello golang7")
	fmt.Println("hello golang8")
	fmt.Println("hello golang9")
}

// 和java的break差不多
func breaktest(){
	var sum int
	for i:=0;i<100;i++ {
		sum+=i
		if sum>50 {
			break
		}
	}
	fmt.Println(sum)
}

// for range的使用
func forrange(){
	var str string = "hellogolang你好"
	for i:=0;i<len(str);i++ {
		fmt.Printf("%c \n",str[i])
	}
	// for range的使用 没有中文的问题
	for i,value := range str {
		fmt.Printf("索引为%d,具体值为%c \n",i,value)
	}
}
// 循环结构
func loop(){
	var sum int
	for i := 0;i < 5;i++ {
		sum+=i
	}
	println(sum)
	// 变化格式
	i:=1
	for i<5 {
		fmt.Println("你好 go")
		i++
	}
	//	死循环
	for ; ; {
		fmt.Println("你好 go lang")
	}
}
// 分支结构
func branch(){
	var count int = 100
	if count<30 {
		println("数量小于30")
	}
	if count:=20;count<30 {
		println("数量小于30")
	}
	// switch 使用
	//给出一个学生分数：
	var score int = 91
	//根据分数判断等级：
	//switch后面是一个表达式，这个表达式的结果依次跟case进行比较，满足结果的话就执行冒号后面的代码。
	//default是用来“兜底”的一个分支，其它case分支都不走的情况下就会走default分支
	//default分支可以放在任意位置上，不一定非要放在最后。
	switch score/10 {
	case 10 :
		fmt.Println("您的等级为A级")
	case 9 :
		fmt.Println("您的等级为A级")
	case 8 :
		fmt.Println("您的等级为B级")
	case 7 :
		fmt.Println("您的等级为C级")
	case 6 :
		fmt.Println("您的等级为D级")
	case 5 :
		fmt.Println("您的等级为E级")
	case 4 :
		fmt.Println("您的等级为E级")
	case 3 :
		fmt.Println("您的等级为E级")
	case 2 :
		fmt.Println("您的等级为E级")
	case 1 :
		fmt.Println("您的等级为E级")
	case 0 :
		fmt.Println("您的等级为E级")
	default:
		fmt.Println("您的成绩有误")
	}
}
// 获取终端用户输入
func scanIn(){
	var age int
	//fmt.Println("请输入年龄")
	//fmt.Scanln(&age)
	//fmt.Println(age)
	var name string
	//fmt.Println("请输入姓名：")
	//fmt.Scanln(&name)
	//fmt.Println(name)
	fmt.Println("请输入年龄和姓名，并用逗号隔开")
	fmt.Scanf("%d %s",&age,&name)
	fmt.Println(name,age)
}
// 指针的使用
func zhizhen(){
	var age int=24
	fmt.Println(&age)

	// 定义指针类型的变量
	var ptr *int= &age;
	fmt.Println(ptr)
	fmt.Println("ptr本身这个存储空间的地址为：",&ptr)
	//想获取ptr这个指针或者这个地址指向的那个数据：
	fmt.Printf("ptr指向的数值为：%v",*ptr)

	fmt.Println("*******通过指针改变指向值*****")
	var num int=10
	var ntr *int=&num
	*ntr=30
	fmt.Println(num) // 此时num变为了30
}
// 基本数据类型转换
func baseType(){
	var n1 int = 19
	var n2 float64 = 4.78
	var n3 bool = false
	var n4 byte = 'a'
	var s1 string = fmt.Sprintf("%d",n1)
	fmt.Printf("s1对应的类型是：%T ，s1 = %q \n",s1, s1)
	var s2 string = fmt.Sprintf("%f",n2)
	fmt.Printf("s2对应的类型是：%T ，s2 = %q \n",s2, s2)
	var s3 string = fmt.Sprintf("%t",n3)
	fmt.Printf("s3对应的类型是：%T ，s3 = %q \n",s3, s3)
	var s4 string = fmt.Sprintf("%c",n4)
	fmt.Printf("s4对应的类型是：%T ，s4 = %q \n",s4, s4)
	// 数字转化为字符串
	var f1 string = strconv.FormatFloat(n2,'f',9,32)
	fmt.Println(f1)
	// 将字符串转化为数字
	var str string="4.78"
	var f7 float64
	f7,_ = strconv.ParseFloat(str, 32)
	fmt.Println(f7)
}

